Profile picture

[Docker-Compose] 도커 컴포즈(Docker Compose)에서 볼륨을 유연하게 활용하는 방법 - SSHFS / NFS

JaehyoJJAng2024년 03월 05일

개요

Docker Compose로 애플리케이션을 구성할 때, 원격 서버의 파일 시스템을 컨테이너에 마운트해야 할 일이 종종 있다.

이를 쉽게 처리할 수 있는 여러 방법 중 SSHFSNFS을 활용하는 방법에 대해 간단하게 기록해 보려고 한다.


SSHFS

SSHFS는 SSH를 통해 원격 파일 시스템을 안전하게 마운트할 수 있는 도구이다.

먼저, SSHFS를 사용하여 컨테이너 볼륨을 유연하게 관리해보는 방법을 기록해보겠다.


SSHFS 플러그인 설치

도커에서 SSHFS를 사용하려면, 먼저 docker-volume-sshfs 라는 플러그인을 설치해줘야 한다.

docker plugin install vieux/sshfs

도커 컴포즈 설정하기

SSHFS를 사용하려면 docker-compose.yaml 파일에 volumes를 정의하고 필요한 옵션을 추가해야 한다.

아래는 기본적인 설정 예시이다.

services:
  my-app:
    image: myapp:latest
    volumes:
      - my_sshfs_volume:/path/in/container

volumes:
  my_sshfs_volume:
    driver: vieux/sshfs
    driver_opts:
      sshcmd: "user@remote-server:/remote/path"
      password: "your-ssh-password"
      allow_other: "true"
      port: "22"

옵션 설명

  • driver_opts.sshcmd: SSH 연결 정버와 원격 디렉토리 경로 지정. 형식은 user@host:/remote/path이다.
    • user@192.168.219.10:/nfs/data
  • driver_opts.password: 원격 서버의 SSH 비밀번호 입력. 보안을 위해 암호를 환경 변수로 관리하는 것을 권장
  • allow_ather: 볼륨에 대한 다른 사용자 접근을 허용할지 결정. 기본값은 false임.
  • port: SSH 연결에 사용할 포트 지정. 파일시스템 서버에 설정된 SSH 포트 번호를 지정해야함.
  • IdentityFile (선택): SSH 키 파일을 따로 사용하는 경우, 해당 속성의 값에다가 키 파일 경로를 지정해준다.

SSH 키 기반 인증 설정

보안을 강화하려면 비밀번호 대신 SSH 키를 사용하는 것이 더 권장된다.

방법은 다음과 같다.

volumes:
  my_sshfs_volume:
    driver: vieux/sshfs
    driver_opts:
      sshcmd: "user@remote-server:/remote/path"
      IdentityFile: "/path/to/private/key"
      allow_other: "true"
      port: "22"

환경 변수를 사용한 보안 강화

비밀번호나 SSH 키 경로를 설정하지 않고, 그냥 환경 변수로 관리하면 보안 및 관리가 용이해진다.

volumes:
  my_sshfs_volume:
    driver: vieux/sshfs
    driver_opts:
      sshcmd: "${SSH_USER}@${SSH_HOST}:${SSH_PATH}"
      password: "${SSH_PASSWORD}"

NFS

이번에는 NFS(Network File System)을 사용하여 컨테이너 간 데이터를 유연하게 관리해보자.


사전 준비

  • NFS가 설치된 서버
    • 도커가 설치된 서버에 설치해도 상관 없음. 그러나 NFS용 서버를 따로 분리하여 생성하는 것을 권장함.

NFS 공유 폴더 생성

NFS 서버 준비가 끝났다면, 그 다음으로는 공유 폴더를 생성해야한다.

예를 들어, 서버 주소는 192.168.219.100/24, 공유 폴더 경로는 /nfs/share/db, /nfs/share/web 라고 가정하겠다.


NFS가 설치되었다고 가정하고, /etc/exports 파일에 다음과 같이 공유 디렉토리를 명시해주자.

/nfs/share/db *(rw,sync,no_subtree_check,no_root_squash)
/nfs/share/web *(rw,sync,no_subtree_check,no_root_squash)
  • rw: 읽기-쓰기 권한 부여
  • sync: 디스크에 데이터를 즉시 동기화
  • no_root_squash: 클라이언트의 루트 사용자가 서버에서도 루트 권한을 가지도록 설정

설정 후 변경사항 적용하자.

sudo exportfs -r
sudo systemctl restart nfs-server

도커 컴포즈 설정하기

NFS 공유 디렉토리를 도커 컴포즈의 볼륨으로 연결하기 위해 아래와 같이 도커 컴포즈를 작성해보자.

services:
  db:
    image: mysql
    environment:
      MYSQL_ROOT_PASSWORD: root
    volumes:
      - "db-data:/var/lib/mysql"
volumes:
  db-data:
    driver: local
    driver_opts:
      type: "nfs"
      o: "addr=192.168.219.179,rw,vers=4"
      device: ":/nfs/share/db
  • type: nfs
    • NFS 타입의 파일 시스템임을 지정.
  • o: addr=<NFS_IP>
    • NFS 서버의 주소를 지정.
  • nfsvers=4
    • 사용 중인 NFS 버전을 명시. (NFS 서버에 맞게 조정)
  • device: ":/nfs/share/db"
    • 공유 폴더의 경로를 지정


주의사항

참고로 NFS 방법을 사용할 경우,

도커가 실행 중인 호스트 머신에 NFS 클라이언트가 설치되어 있어야 한다.

sudo apt-get install -y nfs-common

Loading script...